package com.example.demo_mybatis_many.controller;

import com.example.demo_mybatis_many.utils.RedisUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

@RestController
public class RedisLockController {

    private Integer count2 = 5;

    private final static String LOCK_KEY = "LOCK_KEY_TEST1";

    @Autowired
    RedisUtils redisUtils;

    @GetMapping("testDemo")
    public String testDemo() {
        return "success";
    }

    @GetMapping("test")
    public String test() {
        redisUtils.setCacheObject("ceshiKey", "cccccc", 60 * 10, TimeUnit.SECONDS);
        return "redis中数据：" + redisUtils.getCacheObject("ceshiKey");
    }

    @GetMapping("testRedisLock2")
    public String testRedisLock2() {
        int count = Integer.parseInt(redisUtils.getCacheObject("ceshik") + "");
        if (count > 0) {
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            redisUtils.incr2("ceshik", -1);
            System.err.println("count=" + count);
        }
        return "无同步锁";
    }

    @GetMapping("testRedisLock4")
    public String testRedisLock4() {
        int count = Integer.parseInt(redisUtils.getCacheObject("ceshik") + "");
        if (count > 0) {
            redisUtils.incr2("ceshik", -1);
            System.err.println("count=" + count);
        }
        return "无同步锁";
    }

    @GetMapping("testRedisLock5")
    public String testRedisLock5() {
        synchronized (this) {
            int count = Integer.parseInt(redisUtils.getCacheObject("ceshik") + "");
            if (count > 0) {
                redisUtils.incr2("ceshik", -1);
                System.err.println("count=" + count);
            }
        }
        return "JAVA同步锁";
    }

    @GetMapping("testRedisLock6")
    public String testRedisLock6ByLua() {
        boolean result = redisUtils.decrStock("ceshik", 1);
        if (result) {
            System.err.println("执行发放");
        }
        return "lua";
    }

    static int i = 5;

    public static void main(String[] args) {
//        LocalDateTime now = LocalDateTime.now();
//        long instant = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));
//        System.err.println(instant);

        /**         * 在VM arguments输入-ea就是开启（enableassertion）输入-da就是关闭（disenableassertion）
         *
         * NOTE:断言功能是用于软件的开发和测试的，也就是说，删去断言的那部分语句后，你程序的结构和运行不应该有任何改变，
         * 千万不要把断言当成程序中的一个功能来使用
         *
         * 断言格式
         * assert <布尔表达式>
         * assert <布尔表达式> : <错误信息>
         */

        assert i == 6;
        System.out.println("如果断言正常，我就被打印");
  ///////////////////////////
//        int i = 3;
//        switch (i) {
//            case 1:
//                System.out.println("正常");
//                break;
//            case 2:
//                System.out.println("正常");
//                break;
//            case 5:
//                System.out.println("正常");
//                break;
//            default:
//                assert false:"i的值无效";       //如果i的值不是你想要的，程序就警告退出
//        }
//        System.out.println("如果断言正常，我就被打印");
        //////////////////////////
//        assert(1==0):"1和0不相等！";
        /////////////////////////

//        int a = 11;
//        assert a / 11 == 2 : "不相等";
    }
}
